извлечение данных из двух строкового массива в два разных макета в один просмотр списка - PullRequest
0 голосов
/ 06 мая 2018

я видел много ответов и изменил свой код соответственно. Теперь я застрял со своей собственной проблемой. После запуска этого адаптера я получаю одно значение из списка 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>

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Попробуйте отправить какую-нибудь строку, как в приведенном ниже примере, строку, чтобы определить тип, между которыми вы на самом деле пытаетесь переключиться, в моем случае это было ежемесячно, ежегодно и т. Д. На основе этой строки вы можете использовать различные представления или может быть, легко показать альтернативные макеты.

public class incomeadapter extends ArrayAdapter {
private List<Incomemodel> getdatas;
private int resource;
String incometype;
private LayoutInflater inflater;
Context context;

public incomeadapter(Context context, int resource, List<Incomemodel> getdata, String type) {
    super(context, resource, getdata);
    this.context = context;
    getdatas = getdata;
    incometype = type;
    this.resource = resource;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

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

    TextView t1, t2;

    if (convertView == null) {

        if (incometype.equals("monthly")) {
            convertView = inflater.inflate(R.layout.incomemonthly_item, null);


            t1 = (TextView) convertView.findViewById(R.id.text2);
            t2 = (TextView) convertView.findViewById(R.id.text1);
            t1.setText(getdatas.get(position).getMonths());
            t2.setText(getdatas.get(position).getIncome());

        }
        if (incometype.equals("yearly")) {
            convertView = inflater.inflate(R.layout.incomeyearly_item, null);


            t1 = (TextView) convertView.findViewById(R.id.text2);
            t2 = (TextView) convertView.findViewById(R.id.text1);
            t1.setText(getdatas.get(position).getYear());
            t2.setText(getdatas.get(position).getIncome());

        }

    }


    return convertView;
}
}

PS. Попробуйте использовать recyclerview с несколькими держателями просмотра, это будет легко, я думаю

0 голосов
/ 06 мая 2018

Ваша забота:

я получаю одно значение из списка1 и только два значения из списка2, где оба имеют три значения

Проблема, с которой вы сталкиваетесь, заключается в следующих местах:

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

...

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

И затем вы вызываете метод getItemViewType в методе getView ():

int viewType = getItemViewType(position);

Значение позиции варьируется от 0 до количества элементов в списке минус 1. Таким образом, метод getItemViewType () всегда возвращает 0 (view1), если position = 0, и возвращает 1 (view2), если position = 1, 2 , 3 ...

Затем вы пишете:

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

                 ...

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

                 ...

                        }
                break;
                    }

В case view1 это просто указывает на первый элемент в вашем списке с позицией = 0. В позиции 0 остается только 1 элемент, поэтому 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;
    }
}
...