0

フラグメントを使用して新しいアプリを開発し始めました。フラグメントの 1 つは です。ListFragmentリストの行を表示するために作成したアダプターを使用すると、メソッドで使用するものnullからいくつか取得します。構造は次のとおりです。findViewByIdgetView()

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <FrameLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/fragment_container">
    </FrameLayout>
</RelativeLayout>

frag_detail.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@android:id/list"
        android:layout_gravity="center"/>
</LinearLayout>

詳細リスト項目.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/detailItemLayout" >

    <ImageButton
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:id="@+id/imgIcon"
        android:layout_below="@+id/txtTitle"
        android:layout_centerHorizontal="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="txtTitle"
        android:id="@+id/txtTitle"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="label1"
        android:id="@+id/label1"
        android:layout_below="@+id/imgIcon"
        android:layout_alignParentLeft="true"/>
</RelativeLayout>

DetailFragment クラス

public class DetailFragment extends ListFragment {

    private Context context;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag_detail,container,false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        MonsterDataSource ds = new MonsterDataSource(context);
        List<Monster> lsMonster = ds.getAllMonsters();

        //ListView lsView = (ListView)this.getActivity().findViewById(R.id.lsDetail);
        MonsterListAdapter adapter = new MonsterListAdapter(context,lsMonster);
        //lsView.setAdapter(adapter);
        setListAdapter(adapter);

    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        context = activity.getApplicationContext();
    }
}

そして MonsterListAdapter クラス

public class MonsterListAdapter extends BaseAdapter {
    static class ViewHolder {
        private TextView txtTitle;
        private ImageView imgIcon;
        private TextView txtHealth;
    }

    private Context context;
    private LayoutInflater inflater;
    private List<Monster> data;
    private ViewHolder holder;

    public MonsterListAdapter(Context c, List<Monster> data){
        context = c;
        this.data = data;
        inflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    /*Basic BaseAdapter Methods*/
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        if (view == null) {
            view = inflater.inflate(R.layout.menu_list_item, null);
            holder = new ViewHolder();



            /*Those Guys get null*/
            RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.detailItemLayout);
            holder.txtTitle = (TextView) view.findViewById(R.id.txtTitle);
            holder.imgIcon = (ImageView) view.findViewById(R.id.imgIcon);



            view.setTag(holder);

        } else {
            holder = (ViewHolder) view.getTag();
        }


        Monster monster = data.get(i);

        holder.txtTitle.setText(monster.name);
        holder.imgIcon.setImageResource(monster.imgResID);
        holder.txtHealth.setText(monster.health);

        return view;
    }
}

誰かが尋ねた場合に備えて、相対的なレイアウトを取得して、後でいくつかのコントロールを動的に追加しようとしています。

ありがとう

4

2 に答える 2

4

XML を投稿しましdetail_list_item.xmlたが、コードで inflate しますmenu_list_item.xml

detail_list_item.xml検索しようとしているすべての ID が含まれているため、間違って誤って膨らませたように見えViewますgetView

さらに、ViewHolder をメンバー変数として削除し、getView メソッドのローカル変数として配置する必要があります。その変数を複数のビューで同時に再利用しているため、異なる位置で間違ったビューを変更する可能性があります (データが間違った位置に移動するなど)。

public View getView(int i, View view, ViewGroup viewGroup) {
 ViewHolder holder;
 ...
 ...//all of your other code here
}
于 2013-07-02T14:56:32.590 に答える
0

「ビュー」に影響を与えずに試してください

    RelativeLayout layout = (RelativeLayout)findViewById(R.id.detailItemLayout);
    holder.txtTitle = (TextView) findViewById(R.id.txtTitle);
    holder.imgIcon = (ImageView) findViewById(R.id.imgIcon);

編集これは私にとってはうまくいきます...私のtexviews nbCommentairesとCommentは、ビューをそれらに膨らませるとNullPointerExceptionを与えます...同じ問題が発生すると思いました...

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.comment_row, null);
        }
        v.setTag(position);
        Commentaires o = Global_reco.CommRecos.get(position);
        if (o != null) {    
            TextView nom = (TextView) v.findViewById(R.id.nom_com);
            TextView com = (TextView) v.findViewById(R.id.com);
            ImageView photo = (ImageView) v.findViewById(R.id.profile_com);
            TextView nbCommentaires = (TextView) findViewById(R.id.nb_commentaires);
            TextView Comment = (TextView)findViewById(R.id.nbre_comment);
            photo.setTag(position);
于 2013-07-02T14:58:19.567 に答える