今天遇到在搬之前代碼的時候,需要将我寫在一個活動中的ListView寫到Fragment中,但是,在我要搬完的時候,我的LayoutInflater出問題了,
一、自己所遇到的問題的分析過程
因為自己剛開始用的自定義Adapter,是以建了一個類去繼承BaseAdAapter,并重寫了四個方法,其中getView中的代碼
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
Holder holder;
if(convertView == null){
Log.d("Flag","getView11");
convertView = LayoutInflater.from(SecondActivity.this).inflate(R.layout.my_adapter_item,null);
holder = new Holder();
holder.image = convertView.findViewById(R.id.image);
holder.name = convertView.findViewById(R.id.name);
holder.next = convertView.findViewById(R.id.next);
convertView.setTag(holder);
}else{
holder = (Holder) convertView.getTag();
}
holder.image.setImageResource((Integer) list.get(position).get("img"));
holder.name.setText((String) list.get(position).get("name"));
holder.next.setImageResource((Integer) list.get(position).get("next"));
Log.d("Flag","getView over");
return convertView;
}
}
class Holder{
private ImageView image;
private TextView name;
private ImageView next;
}
convertView = LayoutInflater.from(SecondActivity.this).inflate(R.layout.my_adapter_item,null);
就是這句,先說LayoutInflater.from(SecondActivity.this)這個方法,
from接收的參數是一個Context,不能放Fragment
這個方法傳回值是一個inflater
後面的.inflate(R.layout.my_adapter_item,null),接收的是你要映射的布局,和一個root,
剛開始我想通過在Fragment中
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mine,container,false);
//list為儲存資料的清單
MyAdapter adapter = new MyAdapter(list,inflater);
// MyAdapter adapter = new MyAdapter(list,inflater);
return inflater.inflate(R.layout.fragment_mine,container,false);
}
MyAdapter adapter = new MyAdapter(list,inflater);通過構造方法将inflater傳進去直接調用.inflate(R.layout.my_adapter_item,null),但是運作後,并沒有想要的結果
或者是用MyAdapter adapter = new MyAdapter(list,getActivity());将Context傳過去,但是發現結果都一樣,都是下面的問題:
後面debug發現是因為Fragment中的onCreateView方法中的參數@NonNull LayoutInflater inflater,是MainActivity中的inflater,但是我想要的是Fragment的inflater,是以結果不理想
二、解決辦法
後面百度了“在Fragment中使用ListView”,才解決了我的問題
首先,你的ListView控件的id必須為android:id="@android:id/list",在網上也看到過說android:id="@id/android:list"這樣的寫法,但是我一寫就報錯
讓你的Fragment繼承ListFragment,這樣你就能在你的Fragment中使用
setListAdapter(adapter);方法,
将你的擴充卡改用 SimpleAdapter
//參數一:上下文對象 參數二:資料源List> 參數三:item對應的布局檔案
//參數四:表示由map中定義的key組成的字元串類型的數字 參數五:需要顯示的控件id組成的的數組
//保證參數四和參數五一一對應,否則控件屬性會對換(張冠李戴)
adapter = new SimpleAdapter(getActivity(), getData(images, names),
R.layout.setting_adapter_item, new String[] { "img", "name","next" },
new int[] { R.id.image, R.id.name,R.id.next });
三、最終代碼:
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.example.familyeducationhelp.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class mine extends ListFragment {
private ListView lv;
private SimpleAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//圖檔
int[] images = {R.drawable.news,R.drawable.record,R.drawable.setting};
//内容
String[] names = {"消息中心","家教記錄","設定"};
//參數一:上下文對象 參數二:資料源List> 參數三:item對應的布局檔案
//參數四:表示由map中定義的key組成的字元串類型的數字 參數五:需要顯示的控件id組成的的數組
//保證參數四和參數五一一對應,否則控件屬性會對換(張冠李戴)
adapter = new SimpleAdapter(getActivity(), getData(images, names),
R.layout.setting_adapter_item, new String[] { "img", "name","next" },
new int[] { R.id.image, R.id.name,R.id.next });
//繼承了ListFragment後的方法
setListAdapter(adapter);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_mine,container,false);
lv = view.findViewById(android.R.id.list);
return inflater.inflate(R.layout.fragment_mine,container,false);
}
//監聽點選事件
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if(position == 0){
Toast.makeText(getActivity(),"你點選了 消息中心",Toast.LENGTH_LONG).show();
}else if(position == 1){
Toast.makeText(getActivity(),"你點選了 家教記錄",Toast.LENGTH_LONG).show();
}else if(position == 2){
Toast.makeText(getActivity(),"你點選了 設定",Toast.LENGTH_LONG).show();
}
super.onListItemClick(l, v, position, id);
}
//對資料進行加載
private List extends Map> getData(int[] images, String[] names) {
List> list = new ArrayList>();
for (int i = 0; i < images.length; i++) {
Map map = new HashMap();
map.put("img", images[i]);
map.put("name", names[i]);
map.put("next",R.drawable.next);
list.add(map);
}
return list;
}
}
布局中的代碼:
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline_Listview"
app:layout_constraintTop_toTopOf="@+id/guideline_Listview_Top"
tools:layout_editor_absoluteX="0dp"/>