Android ListView只显示但不会崩溃

时间:2014-12-27 10:24:39

标签: android listview android-fragments android-listview android-adapter

我按照各种来源的所有步骤来获取列表视图但我的一个    似乎没有显示任何东西。这个列表视图代码(如下所示)是通过一个标签片段管理器激活的,我不会在这里把它放在一起,因为这里已经有了很多代码,所以不会让你陷入困境。这很可能是ListFragment本身的问题,但我想它可能是适配器。

我发布的主要xml布局中的搜索视图完全没有显示任何内容。我可以在标签之间自由切换,没有崩溃,但我的任何列表视图中都没有显示任何内容。我有另一个列表,这是一个朋友列表(不包含在此代码片段中),并且使用通用视图持有者界面,并且一个不起作用,这表明问题很可能在我的ListFragment中,但我无法确定它。任何帮助表示赞赏,我希望有些人可以从中学到一些东西,谢谢。

这是我的设置类别列表适配器

package codeblox.com.listfragmentexample;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.ToggleButton;

import java.util.ArrayList;
import codblox.com.listfragmentexample.R;

public class SettingsAdapter extends ArrayAdapter<Settings.SettingsCategories>
{
private final Activity context;
String[] text;
ArrayList<Settings.SettingsCategories> itemsCopy;

class ViewHolder
{
    public TextView txt;
    public CheckBox state;
    public ImageView settingImg;
    public EditText input;
    public ToggleButton toggle;
    public Button settingInfo; // click it to show what the setting does
}

public SettingsAdapter(Context context, ArrayList<Settings.SettingsCategories> items)
{
    super(context, R.layout.settings_category_row, items);
    this.context = (Activity) context;
    this.itemsCopy = items;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = new ViewHolder();
    int viewType = this.getItemViewType(position);

    if(convertView == null)
     {
     // inflate the GridView item layout
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.settings_category_row, parent, false);
     // initialize the view holder
        holder = new ViewHolder();
        holder.settingImg = (ImageView) convertView.findViewById(R.id.settingCategoryImg);
        holder.txt = (TextView) convertView.findViewById(R.id.settingCategoryName);
        convertView.setTag(holder);
    } else {
 // recycle the already inflated view
        holder = (ViewHolder) convertView.getTag();
    }

    // fill data
    holder = (ViewHolder) convertView.getTag();
    String s = getItem(position).toString();
    holder.txt.setText(itemsCopy.get(position).getSettingText());
    holder.settingImg.setImageResource(itemsCopy.get(position).getImgResId());

    return convertView;
 }
}

这是我的列表片段

package codeblox.com.listfragmentexample
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

import codeblox.com.listfragmentexample.R;


public class Settings extends ListFragment implements View.OnLongClickListener
{

private ListView settingsList;
private ArrayList<SettingsCategories> mItems;

private ArrayAdapter<SettingsCategories> settingsAdapter;
private int numCategories;
String[] CategoryArray = new String[] {"Privacy and Security","Account","Networks","Camera Options","Storage","Accesibility","Features"};
int[] resIds = new int[] {R.drawable.security_settings_icon,R.drawable.account_settings_icon,
        R.drawable.network_settings_icon,R.drawable.camera_settings_icon,R.drawable.storage_settings_icon,
        R.drawable.accessibility_settings_icon,R.drawable.feature_settings_icon,};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    View settingsView = inflater.inflate(R.layout.settings, container, false);
    settingsList = (ListView)settingsView.findViewById(android.R.id.list);
    // initialize the items list
   return settingsView;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);
  // remove the dividers from the ListView of the ListFragment
    settingsList = getListView();
    settingsList.setDivider(null);
    mItems = new ArrayList<SettingsCategories>();
    Resources resources = getResources();

    for(int c = 0; c < numCategories; c++)
    {
        mItems.add(new SettingsCategories(CategoryArray[c],resIds[c]));
    }

   // initialize and set the list adapter
    // settingsAdapter = new SettingsAdapter(this.getActivity(), mItems);

    setListAdapter(new SettingsAdapter(getActivity(), mItems));
    settingsList.setAdapter(settingsAdapter);

}

public Settings()
{

  this.numCategories = CategoryArray.length;
}

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}

@Override
public boolean onLongClick(View v)
{
    return false;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id)
{
    Object i = l.getItemAtPosition(position);
}

public class SettingsCategories
{
  private String settingText;
  private int imgResId;

    SettingsCategories(String settingText,int imgResId)
  {
     this.settingText = settingText;
     this.imgResId = imgResId;
  }

   public String getSettingText()
    {
        return this.settingText;
    }
    public int getImgResId()
    {
        return this.imgResId;
    }
 }
}

最后这些是我的xml布局(第一个是主视图,第二个是列表中单个项目的视图

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<SearchView
    android:id="@+id/searchFunction"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
</SearchView>

 <ListView
   android:id="@android:id/list"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
 </ListView>
 </RelativeLayout>

这表示列表中的单个项目

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<ImageView
    android:layout_width="52dp"
    android:layout_height="52dp"
    android:id="@+id/settingCategoryImg"
 />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="52dp"
    android:text=""
    android:id="@+id/settingCategoryName"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/settingCategoryImg"
 />
</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

您正在设置null适配器,因此它不会刷新。 你被评论初始化部分

检查以下方法:

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);
  // remove the dividers from the ListView of the ListFragment
    settingsList = getListView();
    settingsList.setDivider(null);
    mItems = new ArrayList<SettingsCategories>();
    Resources resources = getResources();

    for(int c = 0; c < numCategories; c++)
    {
        mItems.add(new SettingsCategories(CategoryArray[c],resIds[c]));
    }

   // initialize and set the list adapter
    // settingsAdapter = new SettingsAdapter(this.getActivity(), mItems);

    setListAdapter(new SettingsAdapter(getActivity(), mItems));
    settingsList.setAdapter(settingsAdapter);

}

您正在使用ListFragement并再次膨胀布局。这不是一个好主意。当您扩展listfragment时,不需要对布局进行膨胀,并修改上述方法,如:

@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
    super.onViewCreated(view, savedInstanceState);
  // remove the dividers from the ListView of the ListFragment
    settingsList = getListView();
    settingsList.setDivider(null);
    mItems = new ArrayList<SettingsCategories>();
    Resources resources = getResources();

    for(int c = 0; c < numCategories; c++)
    {
        mItems.add(new SettingsCategories(CategoryArray[c],resIds[c]));
    }

   // initialize and set the list adapter
     settingsAdapter = new SettingsAdapter(this.getActivity(), mItems);

    //setListAdapter(new SettingsAdapter(getActivity(), mItems));
    settingsList.setAdapter(settingsAdapter);

}