0

listViewの中央にボタンを追加しようとしています。理想的には、ボタンはlistViewを分割し、その後も続行しますが、これが不可能な場合は、listViewの行内のボタンで問題ありません。例えば。私のリストビューには、1行目(画像+テキスト)、2行目(画像+テキスト)、ボタンがあり、リストビューに進みます。

私は次のコードを書きました。これにより、listViewの行にボタンが追加されますが、途中で、listViewのすべての行に空のボタン(テキストが表示されたボタン)も追加されます。また、中心の重力設定が機能していません。

私のxml

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

     <ImageView android:id="@+id/imgUserIcon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:gravity="center_vertical"
        android:scaleType="fitStart" />

     <Button
         android:id="@+id/buttonShowHide"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="center"
         android:text="@string/showHide" />

     <TextView android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp" 
                    android:layout_marginTop="5dp"
            />

</LinearLayout>

私のアダプター

public class UserAdapter extends ArrayAdapter<UserAccountData> {
    Context context;
    int layoutResourceId;
    User data[] = null;

    public UserAdapter(Context context, int layoutResourceId,
            UserAccountData[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        UserAccountDataHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new UserAccountDataHolder();
            holder.imgIcon = (ImageView) row.findViewById(R.id.imgUserIcon);
            holder.txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            holder.showHide = (Button) row.findViewById(R.id.buttonShowHide);


            row.setTag(holder);
        } else {
            holder = (UserHolder) row.getTag();
        }

        User user = data[position];
        holder.txtTitle.setText(user.title);    
        holder.imgIcon.setImageResource(user.icon);
        holder.showHide.setText(user.buttonName);
        return row;
    }

    static class UserHolder {
        ImageView imgIcon;
        TextView txtTitle;
        Button showHide;    
    }
}

行のJavaオブジェクト。ボタン用と画像とテキスト用の2つのコンストラクターを作成しました。

public class UserAccountData {
    public int icon;
    public String type;
    public String title;
    public CharSequence buttonName;
    public UserAccountData(){
        super();
    }
    // for image and text
    public UserAccountData(int icon, String title, String type) {
        super();
        this.icon = icon;
        this.title = title;
        this.type = type;
    }
    // for button
    public UserData(CharSequence buttonName, String type) {
        super();
        this.buttonName = buttonName;
        this.type = type;
    }

    public void setType(String type){
        this.type = type;
    }
}

私のアクティビティでは、次の2つの行を配列に追加しています。これは、後でアダプターがlistViewの作成に使用します(配列に変更されるArrayListを渡します)。

user_data.add(new UserAccountData(icon, "title,"type"));
user_data.add(new UserAccountData("show Password","button"));

a)listViewと中央を分割してボタンを追加する方法はありますか?同じlistViewを続行しますか?私の現在のソリューションは、行にボタンを追加しようとしているためです。

b)アイコン、タイトルタイプの行に実際に空のボタンも追加している理由はありますか?実際のlistViewにアイコン、タイトル、空のボタンが表示されます

どうもありがとうございます

更新:2つのブログ http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/http://android.amberfog.com/?p=296を見つけまし たが、それでも運がない。もう少し詳細なヘルプをいただければ幸いです

4

1 に答える 1

3

listView と真ん中を分割してボタンを追加する方法はありますか? 同じlistViewを続けますか?私の現在のソリューションは、行にボタンを追加しようとするためです。

あなたの質問を理解したら、次のようなものが必要です。

私のリストビューには次のものがあります:

  • 画像 + テキスト
  • 画像 + テキスト
  • ボタン
  • 画像 + テキスト

等...

getViewTypeCount()と をオーバーライドすると、複数のタイプの行レイアウトを持つことができますgetItemViewType()

  • getViewTypeCount()型の数、この場合は 2 を返す必要があります。
  • getItemViewType(int position)行がどのタイプであるかを返しpositionます。この場合は 0 または 1 です。

添加

画像テキスト行とボタンを区別する方法がよくわかりません。画像がnullかどうかを確認する方法を見つけようとしました(2番目のコンストラクターを使用)が、これはうまくいかないようです

これは良いアプローチのように思えますが、iconintになることはないnullため、初期化されていない整数のデフォルト値は 0 です。試してください:

@Override
public int getItemViewType(int position) {
    UserAccountData data = getItem(position);
    if(data.icon == 0)
        return 1;
    return 0;

    // The same thing in one line:
    //return getItem(position).icon == 0 ? 1 : 0;
}
于 2013-01-28T19:45:35.297 に答える