天天看點

android fragment listview,【Android】在Fragment中使用ListView

今天遇到在搬之前代碼的時候,需要将我寫在一個活動中的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"/>