【问题标题】:Android - Copying item from one listview to another listviewAndroid - 将项目从一个列表视图复制到另一个列表视图
【发布时间】:2015-11-03 15:52:37
【问题描述】:

我一直在研究这个 Android 项目,并且一直在努力解决它。我目前有两个列表视图,都显示数据。

我不确定如何在单击项目时将项目从一个列表视图复制到另一个。

这是我的代码:

public class MainActivity extends Activity {

private ListView mListView1, mListView2;

private String [] rock ={"The Beatles", "The Rolling Stones", "Jimi Hendrix", "Elvis Presley", "Pink Floyd", "AC/DC"};
private String [] pop ={"Michael Jackson", "Beyonce", "Rihanna", "Justin Bieber", "Lady Gaga", "Katy Perry"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mListView1 = (ListView)findViewById(R.id.listView1);
    mListView2 = (ListView)findViewById(R.id.listView2);

    mListView1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, rock));
    mListView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, pop));

    ListUtils.setDynamicHeight(mListView1);
    ListUtils.setDynamicHeight(mListView2);
}


public static class ListUtils {
    public static void setDynamicHeight(ListView mListView) {
        ListAdapter mListAdapter = mListView.getAdapter();
        if (mListAdapter == null) {
            // when adapter is null
            return;
        }
        int height = 0;
        int desiredWidth = MeasureSpec.makeMeasureSpec(mListView.getWidth(), MeasureSpec.UNSPECIFIED);
        for (int i = 0; i < mListAdapter.getCount(); i++) {
            View listItem = mListAdapter.getView(i, null, mListView);
            listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
            height += listItem.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = mListView.getLayoutParams();
        params.height = height + (mListView.getDividerHeight() * (mListAdapter.getCount() - 1));
        mListView.setLayoutParams(params);
        mListView.requestLayout();
    }
}

}

然后是我的 main.xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:text="Rock" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:background="#B29090" >
    </ListView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:gravity="center_vertical"
        android:text="Pop" />

    <ListView
        android:id="@+id/listView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dip"
        android:background="#4A9C67" >
    </ListView>
</LinearLayout>

例如,当单击 The Beatles 时,我希望将其复制到弹出列表视图中。

我已经尝试过使用这个(下面的示例在另一个答案中找到)但它不起作用,因为它说列表视图没有 add() 或 notifyDataSetChange() 方法。

listView1.setOnItemClickListener(this);

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    datasListView2.add(valuesListView1.get(position));
    listView2.notifyDataSetChange();
}

【问题讨论】:

  • 我不确定,但也许你应该做 adapter.notifyDataSetChanged();

标签: java android listview mobile android-listview


【解决方案1】:

所以你有 2 个列表,摇滚和流行,对吧?当您单击第一个 listView(显示摇滚列表的那个)上的一个项目时,您希望将该项目复制到第二个 listView(显示弹出列表的那个)。

您只需将该项目添加到“pop”列表中,然后在 listview 适配器上调用 notifyDataSetChange()。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    pop.add(rock.get(position));
    mListView2.getAdapter().notifyDataSetChange();
}

这应该很容易,但也许您不想修改那个“pop”列表而只修改适配器中显示的列表?

在这种情况下,您应该在每个适配器中存储一个数组副本,这样您就可以在不影响主列表的情况下对其进行修改。

要实现这一点,您需要对正在使用的适配器进行子类化。

希望这会有所帮助。

【讨论】:

    【解决方案2】:
    private String [] rock ={"The Beatles", "The Rolling Stones", "Jimi Hendrix", "Elvis Presley", "Pink Floyd", "AC/DC"};
    private String [] pop ={"Michael Jackson", "Beyonce", "Rihanna", "Justin Bieber", "Lady Gaga", "Katy Perry"};
    
    private List rocklist = new ArrayList();
    private List poplist = new ArrayList();
    private ArrayAdapter adapterRock;
    private ArrayAdapter adapterPop;
    private ListView mListView1;
    private ListView mListView2;
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        for(String a : rock){
            rocklist.add(a);
        }
        for (String b : pop){
            poplist.add(b);
        }
    
        mListView1 = (ListView)findViewById(R.id.listView1);
        mListView2 = (ListView)findViewById(R.id.listView2);
        adapterRock =  new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, rocklist);
        mListView1.setAdapter(adapterRock);
        adapterPop = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, poplist);
        mListView2.setAdapter(adapterPop);
    
        mListView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                poplist.add(rocklist.get(position));
                adapterPop.notifyDataSetChanged();
            }
        });
    
    }
    

    【讨论】:

    • 试过了,但是当我点击一个项目时它似乎没有做任何不同的事情。两个列表视图保持不变
    • 如果arrayList是不同的模型,我们如何将组件从一种类型移动到另一种类型。
    猜你喜欢
    • 2020-03-28
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多