自定义适配器不显示数据
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 意味着它显示它的原始高度或宽度。以上是关于自定义适配器不显示数据的主要内容,如果未能解决你的问题,请参考以下文章