Можно ли передать только строку в пользовательский адаптер списка? - PullRequest
0 голосов
/ 15 декабря 2018

Я прохожу через цикл while, который имеет другое значение Strings для моего адаптера.Но это ничего не показывает, однако, если я передам массив, это работает.Я не знаю, смогу ли я передать только String и если return переопределенных методов верны.

public class ReportAdapter extends BaseAdapter {

private Context context;
private String debtor;
private String receiver;
private BigDecimal difference;
private String groupName;
LayoutInflater inflater;

public ReportAdapter(Context applicationContext, String debtor, String receiver, BigDecimal difference, String groupName) {
    this.context = applicationContext;
    this.debtor = debtor;
    this.receiver = receiver;
    this.difference = difference;
    this.groupName = groupName;
    inflater = LayoutInflater.from(applicationContext);

}


@Override
public int getCount() {
    return 0;
}

@Override
public Object getItem(int position) {
    return 0;
}

@Override
public long getItemId(int position) {
    return 0;
}

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

    DecimalFormat df = new DecimalFormat("##.00");
    SharedPreferences sharedPrefs = context.getSharedPreferences("sharedPrefs", Context.MODE_PRIVATE);
    final SharedPreferences.Editor editor = sharedPrefs.edit();
    convertView = inflater.inflate(R.layout.report_list_view, null);
    TextView debtor = convertView.findViewById(R.id.debtor_tv);
    TextView receiver = convertView.findViewById(R.id.receiver);
    TextView difference = convertView.findViewById(R.id.difference_tv);
    final CardView paidCard = convertView.findViewById(R.id.paid_cardview);
    final Switch paidSwitch = convertView.findViewById(R.id.paid_switch);


    debtor.setText(debtor.toString());

    receiver.setText(receiver.toString());

    difference.setText(String.valueOf(df.format(difference) + "€"));

    paidSwitch.setChecked(sharedPrefs.getBoolean(groupName + "_checkValue" + position, false));
    if (paidSwitch.isChecked()) {
        // Set green background
        paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
    }
    paidSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                // Set green background
                paidCard.setCardBackgroundColor(Color.parseColor("#FF2E7D32"));
                editor.putBoolean(groupName + "_checkValue" + position, isChecked);
                editor.commit();

            } else {
                // Set red background
                paidCard.setCardBackgroundColor(Color.parseColor("#FFB71C1F"));
                editor.putBoolean(groupName + "_checkValue" + position, isChecked);
                editor.commit();

            }

        }
    });
    return convertView;
}

Список не отображается.Может ли быть так, что конструктор принимает только тип Array?Или я могу сдать String?Методы getCount() и getItem() должны возвращать 0?Потому что с ArrayList я возвращаю arraylist.get(position), а с String, что я должен вернуть?

1 Ответ

0 голосов
/ 15 декабря 2018

Конечно, вы можете передать String значения в ListView.Мой вопрос: зачем использовать ListView для одной записи?ListView генерирует много служебных данных.

Почему ListView не показывает никаких значений, потому что метод getCount() определяет, сколько строк отображается в вашем списке.

AЛучшим решением было бы создать пользовательский класс - возможно, Transactions, который содержит получатели и установщики для должника и получателя.Добавьте новый Transactions к ArrayList для каждой строки, которая будет отображаться в ListView ..., даже если это всего одна строка.


Возможное решение ::

public class MyListAdapter extends ArrayAdapter<Transaction> {

    private static final String TAG = MyListAdapter.class.getSimpleName();


    public MyListAdapter(Context context, ArrayList<Transaction> transactionList) {
        super(context, 0, transactionList);
    }

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

        Transaction transactionData = getItem(position);

        if(convertView == null){
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_layout_2, parent, false);
        }

        TextView textView1 = (TextView) convertView.findViewById(R.id.textView1);
        TextView textView2 = (TextView) convertView.findViewById(R.id.textView2);


        String debtor = transactionData.getDebtor();
        String receiver = transactionData.getReceiver();
        textView1.setText(debtor);
        textView2.setText(receiver);

        return convertView;
    }
}

Пользовательский класс Transaction может выглядеть следующим образом:

public class Transaction {

    private String debtor = "";
    private String receiver = "";

    public Transaction(){
    }
    public Transaction(String debtor, String receiver){
        this.debtor = debtor;
        this.receiver = receiver;
    }

    public void setDebtor(String debtor){ this.debtor = debtor; }
    public void setReceiver(String receiver){ this.receiver = receiver; }

    public String getDebtor(){ return this.debtor; }
    public String getReceiver() { return this.receiver; }
}

Теперь вы можете просто заполнить список:

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

    // There would of course be a better way to populate the data!!
    ArrayList<> transactionList = new ArrayList<>();
    transactionList.add(new Transaction("Mike","Bob"));


    MyListAdapter theAdapter = new MyListAdapter(this, arrayDriverListData);

    ListView transaction_list = (ListView) findViewById(R.id.transaction_list);

    transaction_list.setAdapter(theAdapter);
}

ПРИМЕЧАНИЕ:
Я набрал это в стандартном TextEditor (без автокоррекции) ... поэтому может быть несколько ошибок.

...