自定义适配器不显示数据

Posted

技术标签:

【中文标题】自定义适配器不显示数据【英文标题】:Custom Adapter Not showing data 【发布时间】:2014-04-14 13:28:22 【问题描述】:

我开发了一个从 SQLite 获取数据的自定义适配器。数据正在选择,适配器也获取数据。但它没有显示在列表视图中。我没有收到任何错误。我打印的数据进入适配器,但只显示一组数据。并非所有数据。

我已经开发并遵循了正常的自定义适配器实现示例。

我有一些疑问。

1-在我的 customAdapter 类中。当我在调用 findviewById() 时为适配器中的自定义行膨胀 XML 时,只有一个文本视图显示“它可能会产生空指针异常”。为什么?我用于列表视图行的 xml。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:orientation="vertical"
                android:paddingTop="4dip"
                android:paddingBottom="6dip"
                android:paddingLeft="10dip"
                android:paddingRight="10dip"
                android:layout_
                android:layout_
                android:weightSum="1">

    <TextView
        android:layout_
        android:layout_
        android:id="@+id/row_item_name"
        android:textColor="@color/item_name_color"
        android:layout_alignParentLeft="true"
        />

    <TextView
        android:layout_
        android:layout_
        android:id="@+id/row_item_price"

        android:textColor="@color/item_price_color"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <TextView
        android:layout_
        android:layout_
        android:id="@+id/row_item_contains"

        android:layout_gravity="left"
        android:layout_below="@id/row_item_name"
        android:layout_toRightOf="@id/row_item_name" />

    <TextView
        android:layout_
        android:layout_

        android:id="@+id/row_item_quantity"
        android:layout_above="@id/row_item_contains"
        android:paddingRight="10dip"
        android:layout_toLeftOf="@id/row_item_price" />


</RelativeLayout>

    在我的片段类中,上面还显示了膨胀列表视图元素的警告。 下面给出了我的片段 xml。

    <TextView
        android:id="@+id/tableTextview"
        android:layout_
        android:layout_
        android:layout_gravity="left"
        android:text="@string/table"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    
    <TextView
        android:id="@+id/userName"
        android:layout_
        android:layout_
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_gravity="right"
        android:textColor="@color/bg" />
    
    
    
    <EditText
        android:paddingTop="6dp"
        android:id="@+id/tableNumber"
        android:layout_
        android:layout_
        android:inputType="number"
        android:maxWidth="@dimen/tableNoSize"
        android:layout_below="@id/tableTextview"
        android:layout_alignRight="@id/tableTextview"
        android:layout_alignEnd="@id/tableTextview" />
    
    <TextView
        android:id="@+id/textView"
        android:layout_
        android:layout_
        android:layout_alignLeft="@id/tableNumber"
        android:layout_alignStart="@id/tableNumber"
        android:layout_below="@id/tableNumber"
        android:layout_gravity="center"
        android:paddingTop="6dip"
        android:paddingBottom="4dip"
        android:text="@string/Menu" />
    
    <ListView
        android:layout_below="@id/textView"
        android:id="@+id/bearer_menu_order_list"
        android:layout_
        android:layout_>
    </ListView>
    
    <Button
        android:id="@+id/placeButton"
        android:layout_
        android:layout_
        android:layout_below="@id/textView"
        android:layout_gravity="center_horizontal"
        android:background="@color/buttonColor"
        android:text="@string/placeOrder" />
    

我的适配器代码

    public class MenuListAdapter extends BaseAdapter 
    private List<MenuData> list;
    private Context context;

    public MenuListAdapter(Context context, List<MenuData> list) 
        this.context = context;
        this.list = list;
        Log.e("Hee",list.size()+"");
    
    @Override
    public int getCount() 
        return list.size();
    

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

        //Log.e("list got--",""+list.size());
        Log.e("position ",""+position);

        ViewHolder holder;
        LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null)
            convertView = inflater.inflate(R.layout.row_list_create_new,null);
            holder = new ViewHolder();
            try
                holder.txtName=(TextView)convertView.findViewById(R.id.row_item_name);
                holder.txtContains=(TextView)convertView.findViewById(R.id.row_item_contains);
                holder.txtPrice=(TextView)convertView.findViewById(R.id.row_item_price);
                holder.txtQuantity=(TextView)convertView.findViewById(R.id.row_item_quantity);
                convertView.setTag(holder);
                Log.e("covertView-","Null");
            
            catch (NullPointerException e)
                e.printStackTrace();
            

        
        else 
            Log.e("covertView-","Not Null");
            holder = (ViewHolder) convertView.getTag();
        

        MenuData currentRow=list.get(position);
        Log.e("item ",currentRow.getKEY_ITEM_NAME());
        holder.txtName.setText(currentRow.getKEY_ITEM_NAME());
        holder.txtContains.setText(currentRow.getKEY_ITEM_CONTENTS());
        holder.txtPrice.setText(currentRow.getKEY_PRICE());

        return convertView;
    


    class ViewHolder 
        public TextView txtName;
        public TextView txtPrice;
        public TextView txtContains;
        public TextView txtQuantity;

    


片段代码是

 public class CreateOrderFragment extends Fragment 

    List<MenuData> listMenu;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        View rootView;
        listMenu=new ArrayList<MenuData>();
        rootView = inflater.inflate(R.layout.fragment_create_new_order_list_sections, container, false);
        Context context=getActivity();
        //View view=getView();
        ListView menuList;
        menuList=(ListView) rootView.findViewById(R.id.bearer_menu_order_list);
        menuList.setVisibility(View.VISIBLE);
        DatabaseHelper helper=new DatabaseHelper(context);
        listMenu = helper.getMenuItem();
        Log.e("list menu--",listMenu.size()+"");
        MenuListAdapter adapter=new MenuListAdapter(context,listMenu);
        Log.e("list adapter--",""+adapter.getCount());
        menuList.setAdapter(adapter);
        menuList.setVisibility(View.VISIBLE);

        return rootView;
    



    @Override
    public void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);

        String user;
        TextView tv;


【问题讨论】:

然后发布您的适配器代码。 请将相关部分的代码贴好。 现在发布您的片段代码 ListView 中绑定适配器的代码在哪里? menuList.setAdapter(适配器); 【参考方案1】:

试试这个方法:

 ListView menuList;
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
    View rootView;
    rootView = inflater.inflate(R.layout.fragment_create_new_order_list_sections, container, false);

    menuList=(ListView) rootView.findViewById(R.id.bearer_menu_order_list);
    DatabaseHelper helper=new DatabaseHelper(getActivity());
    listMenu = helper.getMenuItem();
    Log.e("list menu--",listMenu.size()+"");
    MenuListAdapter adapter=new MenuListAdapter(getActivity(),listMenu);
    Log.e("list adapter--",""+adapter.getCount());
    menuList.setAdapter(adapter);
    menuList.setVisibility(View.VISIBLE);

    return rootView;

并从onActivityCreated(....) 中删除所有代码,并就此向我提供反馈。

【讨论】:

【参考方案2】:

您可以简单地为 Fragment 实现 onCreateView()。

 ListView menuList;

 @Override
 public View onCreateView(LayoutInflater inflater,
  ViewGroup container, Bundle savedInstanceState) 

  // Inflate the layout for this fragment

    View rootView;
    rootView = inflater.inflate(R.layout.fragment_create_new_order_list_sections, container, false); 
    menuList=(ListView) rootView.findViewById(R.id.bearer_menu_order_list);
    DatabaseHelper helper=new DatabaseHelper(getActivity());
    listMenu = helper.getMenuItem();
    Log.e("list menu--",listMenu.size()+"");
    MenuListAdapter adapter=new MenuListAdapter(getActivity(),listMenu);
    Log.e("list adapter--",""+adapter.getCount());
    menuList.setAdapter(adapter);
    menuList.setVisibility(View.VISIBLE);
   return rootView;
 

你的适配器类也在这里改变

 public class MenuListAdapter extends BaseAdapter 
 private List<MenuData> list;
 private Context context;

 public MenuListAdapter(Context context, List<MenuData> list) 
    this.context = context;
    this.list = list;
    Log.e("Hee",list.size()+"");
 

从 onActivityCreated() 方法中删除所有代码。

【讨论】:

@Rashid 只是正确地看到我的答案.. 这里 (ListView) view.findViewById(R.id.bearer_menu_order_list) 不查看它的 rootView。所以改变(ListView)rootView.findViewById(R.id.bearer_menu_order_list) @Rashid 在rootView 的上下文中引用您的Listview 而不是view 作为ListView menuList=(ListView) rootView.findViewById(R.id.bearer_menu_order_list); @Rashid 做一件事将这一行 menuList.setVisibility(View.VISIBLE); 移到这一行之后 menuList=(ListView) rootView.findViewById(R. id.bearer_menu_order_list); @Rashid 只需检查您何时从数据库中获取数据,是否获取相同的数据或问题出在您的适配器中?之后我会告诉你的。! 这将在你给 ListView 赋予权重时使用 android:layout_ ,此时它的高度或宽度必须为 0px 取决于线性布局的方向。如果你设置 wrap_content 意味着它显示它的原始高度或宽度。

以上是关于自定义适配器不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

android自定义列表适配器不显示项目

来自自定义 LinearLayout 的子级不显示波纹效果

ListView 根本不显示

android simpleadapter不显示图片

Android Studio 将自定义适配器添加到 AsyncTask

listview 项目未在自定义适配器的 getview 方法中显示分配的值