1

私はAndroid開発に不慣れです。動的リストビューを使用してデモプロジェクトを正常に作成しましたが、list_rowxmlファイルに2つのテキストビューがあるという問題があります。

Textview2はデフォルトのhide(Visibility = Gone)です。

次に、そのテキストビューの可視性をリストビューの5番目の位置にのみ表示するように設定しました。そのためのコードを書きましたが、テキストビューは5番目の位置だけでなく、ランダムに表示されます。リストビューに100件のレコードがあります。

私は何が間違っているのですか?

編集 :

public View getView(int position, View convertView, ViewGroup parent) 
{
    // TODO Auto-generated method stub
    ViewHolder holder;

    if (convertView == null) 
    {
        convertView = mLayoutInflater.inflate(R.layout.list_row, null);
        holder = new ViewHolder();
        holder.text1 = (TextView) convertView.findViewById(R.id.mytext);
        holder.text2 = (TextView) convertView.findViewById(R.id.invisibletext);
        convertView.setTag(holder);
        if (position == 5) 
            holder.text2.setVisibility(View.VISIBLE);
        else
            holder.text2.setVisibility(View.GONE);
    } 
    else 
    {
        holder = (ViewHolder) convertView.getTag();
    }

    return convertView;
}

static class ViewHolder 
{
    TextView text1;
    TextView text2;
}
4

2 に答える 2

0

問題は、アダプターの convertViews がリサイクルされることです。

アダプターの getView() 関数の位置をテストしていると仮定しています。次のようにコードを変更します。

if (position == 4)
    convertView.setVisibility(View.INVISIBLE);
else 
    convertView.setVisibility(View.VISIBLE);

これにより、5 番目の位置に表示されるように設定された後、convertView が強制的に再表示されます。

編集: if else 条件が間違った場所にある

 public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;

    if (convertView == null) {
        convertView = mLayoutInflater.inflate(R.layout.list_row, null);

        holder = new ViewHolder();

        holder.text1 = (TextView) convertView.findViewById(R.id.mytext);

        holder.text2 = (TextView) convertView

        .findViewById(R.id.invisibletext);

        convertView.setTag(holder);


    } else {

        holder = (ViewHolder) convertView.getTag();

    }

    if (position == 5) {
        holder.text2.setVisibility(View.INVISIBLE);
    } else {
        holder.text2.setVisibility(View.VISIBLE);
    }

    return convertView;

}

}

static class ViewHolder {
TextView text1;

TextView text2;

}
于 2012-09-17T17:10:17.227 に答える
0

convertView が null でない場合は、if-else 条件が起動しないため、convertView が null の場合は起動するため、ランダムに動作します。

以下のようにコードを更新してください...

   public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;

        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.list_row, null);

            holder = new ViewHolder();

            convertView.setTag(holder);
         } else {
                holder = (ViewHolder) convertView.getTag();
            }


      holder.text1 = (TextView) convertView.findViewById(R.id.mytext);
      holder.text2 = (TextView) convertView.findViewById(R.id.invisibletext);

      if (position == 5) {
                holder.text2.setVisibility(View.VISIBLE);

            } else {
                holder.text2.setVisibility(View.GONE);
            }

        return convertView;

    }

}
于 2012-09-17T17:18:54.850 に答える