片段中ListView的android自定义适配器

Posted

技术标签:

【中文标题】片段中ListView的android自定义适配器【英文标题】:android custom adapter for ListView in a fragment 【发布时间】:2019-04-14 04:14:14 【问题描述】:

我为片段中的 ListView 创建了自己的自定义适配器。我相信我的一切都是正确的,但是在启动我的应用程序时它仍然会引发错误并崩溃。我尝试调试它,但最终无法找到问题。

这是我的片段代码:

public class TabFragment0 extends Fragment 

Button addPR;
ArrayList<PRObject> PRList;
PRObjectAdapter PRListAdapter;
private ListView listViewer;
private final String PRKey = "PRArgs";

public TabFragment0() 
    // Required empty public constructor


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.tab_personalrecords, container, 
        false);
    if(loadList(PRKey) != null) 
        PRList = loadList(PRKey);
    
    PRListAdapter = new PRObjectAdapter(getActivity(), PRList);
    listViewer = (ListView) view.findViewById(R.id.prListView);
    listViewer.setAdapter(PRListAdapter);
...................................................

listViewer.setAdapter(PRListAdapter); 行是引发错误的原因。我也试过PRListAdapter = new PRObjectAdapter(this.getActivity(), PRList);PRListAdapter = new PRObjectAdapter(getContext(), PRList); 都无济于事。

这是我的适配器类代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;

public class PRObjectAdapter extends BaseAdapter 

private LayoutInflater inflater;
private ArrayList<PRObject> objects;

private class ViewHolder 
    TextView textview1;
    TextView textview2;


public PRObjectAdapter(Context context, ArrayList<PRObject> objects) 
    inflater = LayoutInflater.from(context);
    this.objects = objects;


@Override
public int getCount() 
    return objects.size();


@Override
public Object getItem(int position) 
    return objects.get(position);


@Override
public long getItemId(int position) 
    return position;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    PRObjectAdapter.ViewHolder holder = null;
    if(convertView == null) 
        holder = new PRObjectAdapter.ViewHolder();
        convertView = inflater.inflate(R.layout.pr_item_layout, null);
        holder.textview1 = (TextView) 
                   convertView.findViewById(R.id.prTitleTV);
        holder.textview2 = (TextView) 
                   convertView.findViewById(R.id.prNumTV);
        convertView.setTag(holder);
     else 
        holder = (PRObjectAdapter.ViewHolder) convertView.getTag();
    
    holder.textview1.setText(objects.get(position).getTitle());
    holder.textview2.setText(objects.get(position).getNum());
    return convertView;


我想说问题出在我的View getView 方法中,但我无法确定问题所在。 任何帮助将不胜感激。

编辑:

这个问题不是重复的 this NullPointerException question

我的问题专门针对 Android Studio 中的片段/customAdapter 组合,而上面的链接只是关于 NPE 是什么以及如何修复它的指南。

【问题讨论】:

分享您的日志报告。 objects.get(position).getNum() “getNum()”的返回类型是什么? 我是个彻头彻尾的白痴。查看ArrayList&lt;PRObject&gt; PRList; 行,然后将其与PRListAdapter = new PRObjectAdapter(getActivity(), PRList); 进行比较。注意到有什么奇怪的吗? ArrayList&lt;PRObject&gt; PRList; 必须是 ArrayList&lt;PRObject&gt; PRList = new ArrayList&lt;PRObject&gt;();.... 我真是个白痴,哈哈 What is a NullPointerException, and how do I fix it?的可能重复 @HovercraftFullOfEels 它不是重复的。 【参考方案1】:

好的,结果证明适配器类没有任何问题,它可以按预期完美运行。我的问题是:

ArrayList&lt;PRObject&gt; PRList;

在我的片段类中没有被初始化。

解决方法是将其更改为:

ArrayList&lt;PRObject&gt; PRList = new ArrayList&lt;PRObject&gt;();

视图现在按预期加载。希望有人可以利用我的适配器类,因为它可以工作,哈哈

大家加油!

【讨论】:

以上是关于片段中ListView的android自定义适配器的主要内容,如果未能解决你的问题,请参考以下文章

片段中的自定义列表适配器

带有复选框和自定义适配器的 ListView,片段无法正常工作

从自定义适配器获取片段中的 UI 元素 ID

如何在android中去listview适配器项目点击监听器片段?

ArrayIndexOutOfBoundsException 与 ListView 中的多个视图的自定义 Android 适配器

使用自定义适配器自定义 Android ListView