首页 > 解决方案 > 将数据从两个字符串数组提取到两个不同的布局到单个列表视图中

问题描述

我已经看到了很多答案,并相应地更改了我的代码。现在我遇到了自己的问题。运行此适配器后,我从 list1 中获得一个值,而从 list2 中只有两个值,其中两个值都具有三个值。布局很好。我不知道是什么原因造成的,我我对arrayadapter也不是很熟悉。这将是一个很大的帮助。提前致谢。

public class AxisAdapter extends ArrayAdapter<String> {

    private ArrayList<String> list1 = new ArrayList<String>();
    private ArrayList<String> list2 = new ArrayList<String>();

    private Context context;
    private final int view1 = 0;
    private final int view2 = 1;

    public MyAdapter(Context context, ArrayList<String> records,ArrayList<String> records1) {
        super(context, 0, records);
        this.context = context;
        list1=records;
        list2=records1;

    }

    public int getViewTypeCount() {
        return 2;
    }

    public int getItemViewType(int position) {
        return (position == 0) ? view1 : view2;
    }

    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        int viewType = getItemViewType(position);
        switch (viewType) {
            case view1: {
                final String item = list1.get(position);

                if (convertView == null) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.abc_layout, parent, false);
                }
                final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDef);
                Button list_But = (Button) convertView.findViewById(R.id.btnCall);

                list_Txt.setText(item.replaceAll("[^A-Za-z]", " "));


                list_But.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String number = item.replaceAll("[A-Za-z]", "");

                        Intent i = new Intent(Intent.ACTION_VIEW,
                                Uri.parse("tel:" + number));
                        context.startActivity(i);
                    }

                });
            }
            break;
            case view2: {
                final String item = list2.get(position);
                if (convertView == null) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.url_layout, parent, false);
                }
                final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDetail);
                Button list_But = (Button) convertView.findViewById(R.id.btnVisit);
                list_Txt.setText(item.replaceAll("[^A-Za-z]", " "));
                list_But.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String number = item.replaceAll("[A-Za-z]", "");
                        Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:12345"));
                        context.startActivity(i);
                    }
                });
            }
            break;


        }


        return convertView;
    }
}

在我的活动课上

public class AnActivity extends AppCompatActivity {

    Toolbar toolbar;
    AxisAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_axis);

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        if(getSupportActionBar()!= null){
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

        ListView list = (ListView) findViewById(R.id.axisList);
        String[] ussd = getResources().getStringArray(R.array.axisCode);
        String[] links = getResources().getStringArray(R.array.axisLink);

        ArrayList<String> myData = new ArrayList<String>();
        ArrayList<String> myLinks = new ArrayList<String>();


        for(int i = 0; i<ussd.length;i++) {
            myData.add(ussd[i]);
        }

        for(int i =0;i<links.length;i++){
            myLinks.add(links[i]);

        }

        adapter = new AxisAdapter(this,myData,myLinks);
        list.setAdapter(adapter);

        //adapter= new AxisAdapter(this,myLinks);
        //list.setAdapter(adapter);

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home)
            finish();


        return super.onOptionsItemSelected(item);
    }
}

在我的两个布局类中,都有一个按钮和一个文本框。

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


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="5dp"
        android:background="@color/textboxColor">

        <TextView
            android:id="@+id/txtDef"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:fontFamily="@font/roboto_slab"
            android:padding="5dp"
            android:text="TextView"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:textSize="20sp" />

        <Button
            android:id="@+id/btnCall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="0"
            android:fontFamily="@font/roboto_slab_bold"
            android:text="Call"
            android:theme="@style/PrimaryButton" />

    </LinearLayout>
</LinearLayout>

另一个:

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


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="5dp"
        android:background="@color/textboxColor">

        <TextView
            android:id="@+id/txtDetail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:layout_marginLeft="2dp"
            android:layout_weight="1"
            android:fontFamily="@font/roboto_slab"
            android:padding="5dp"
            android:text="TextView"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:textSize="20sp" />

        <Button
            android:id="@+id/btnVisit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="2dp"
            android:layout_weight="0"
            android:fontFamily="@font/roboto_slab_bold"
            android:text="Visit"
            android:theme="@style/PrimaryButton" />

    </LinearLayout>
</LinearLayout>

标签: androidandroid-layoutlistviewlayoutandroid-arrayadapter

解决方案


你所关心的:

我从 list1 中得到一个值,而从 list2 中只有两个值,它们都有三个值

您面临的问题在于这些地方:

private final int view1 = 0;
private final int view2 = 1;

...

public int getItemViewType(int position) {
    return (position == 0) ? view1 : view2;
}

然后在 getView() 方法中调用 getItemViewType 方法:

int viewType = getItemViewType(position);

position 的取值范围是从 0 到列表中的项目数减 1。因此 getItemViewType() 方法总是在 position = 0 时返回 0(view1),如果 position = 1、2、3,则返回 1(view2)。 ..

然后你写:

    switch (viewType) {
                case view1: {
                    final String item = list1.get(position);

                 ...

                            }
                break;
            case view2: {
                final String item = list2.get(position);

                 ...

                        }
                break;
                    }

在 中case view1,它只是表示列表中位置 = 0 的第一项。只有 1 项停留在位置 0,因此final String item = list1.get(position);只调用一次,这就是它返回 1 值的原因。

在 中case view2,它只是表示位置 1、2、3 的项目...正如您所说的列表中有 3 个项目,适配器将为列表视图生成 3 个项目,case view2并将等于位置 1 和 2。所以final String item = list2.get(position);被调用了两次,这就是它返回 2 个值的原因。

我不知道你的下一步是什么,因为我不明白你的期望。

更新:具体解决方案:

public class AxisAdapter extends ArrayAdapter<String> {

    private ArrayList<String> list1;
    private ArrayList<String> list2;

    private Context context;

    public AxisAdapter(Context context, ArrayList<String> records,ArrayList<String> records1) {
        super(context, 0);
        this.context = context;
        list1=records;
        list2=records1;

    }

    @Override
    public int getCount() {
        return list1.size() + list2.size();
    }

    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        if (position < list1.size()) {
            final String item = list1.get(position);
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.abc_layout, parent, false);

            final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDef);
            Button list_But = (Button) convertView.findViewById(R.id.btnCall);

            list_Txt.setText(item.replaceAll("[A-Za-z]", ""));


            list_But.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String number = item.replaceAll("[A-Za-z]", "");

                    Intent i = new Intent(Intent.ACTION_VIEW,
                            Uri.parse("tel:" + number));
                    context.startActivity(i);
                }

            });
        }

        else {

            final String item = list2.get(position - list1.size());
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.url_layout, parent, false);
            final TextView list_Txt = (TextView) convertView.findViewById(R.id.txtDetail);
            Button list_But = (Button) convertView.findViewById(R.id.btnVisit);
            list_Txt.setText(item.replaceAll("[A-Za-z]", ""));
            list_But.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String number = item.replaceAll("[A-Za-z]", "");
                    Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:12345"));
                    context.startActivity(i);
                }
            });
        }

        return convertView;
    }
}

推荐阅读