获取 ListView 单元格对象以在构建时递增

Getting a ListView cell object to increment on construction

所以我正在尝试在 android 工作室中制作一个简单的优先待办事项列表。我创建了一个硬编码列表来测试,列表单元格内容只是优先级的整数和消息的字符串。我在让细胞填充时遇到了麻烦。我终于到了列表在屏幕上填充的地步,但我无法弄清楚如何获得自动递增 after/during 每个对象构造的优先级。我只得到全 1。我想我不清楚细胞群中发生的过程,或者我可能不完全理解基本构造函数。非常感谢任何 help/pointers。对所有 Log.d 表示抱歉,我真的不完全理解适配器,并且在找出正确的语法时遇到了麻烦。

这是 Cell 对象

public class CellContent {
    private int priority = 0;
    private String itemContent;

    public CellContent(String itemContent)
    {
        priority+=1;
        this.itemContent = itemContent;
    }

    public String getItemContent() {
        return itemContent;
    }

    public void setItemContent(String itemContent) {
        this.itemContent = itemContent;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority=priority;

    }
}

这是包含单元格的列表

public class ListDataSource {

    private ArrayList<CellContent> todoList;

    public ListDataSource() {
        todoList = new ArrayList<CellContent>();
        setupToDoList();
        Log.d("ListDataSource", "ListDataSource object created");
    }

    public void setupToDoList()
    {
        todoList.add(new CellContent("Wash Dishes"));
        todoList.add(new CellContent("Do Laundry"));
        todoList.add(new CellContent("Clean Bathroom"));
        todoList.add(new CellContent("Sweep and Mop"));
        todoList.add(new CellContent("Walk Dog"));
    }
    public int getPriority(int position)
    {
        return todoList.get(position).getPriority();
    }

    public String getItemContent(int position)
    {
        return todoList.get(position).getItemContent();
    }

    public int getDataSourceLength()
    {
        return todoList.size();
    }
}

这是适配器

public class ListDataSourceAdapter extends BaseAdapter {

        private Context myContext;
        private LayoutInflater myInflater;
        private ListDataSource myDataSource;

        public ListDataSourceAdapter(Context ctx, ListDataSource ds)
        {
            Log.d("ListDataSourceAdapter","Attempting to create ListDataSourceAdapter");
            myContext = ctx;
            myDataSource = ds;
            myInflater = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            Log.d("ListDataSourceAdapter","ListDataSourceAdapter created successfully");
        }

        @Override
        public int getCount()
        {
            return myDataSource.getDataSourceLength();
        }

        @Override
        public Object getItem(int arg0)
        {
            return myDataSource.getItemContent(arg0);
        }

        @Override
        public long getItemId(int position)
        {
            return myDataSource.getPriority(position);
        }

        @Override
        public View getView (int position, View convertView, ViewGroup parent)
        {
            Log.d("getView","Attempting getView");
            TextView priority;
            TextView itemContent;
            if(convertView == null)
            {
                Log.d("getView", "Attempting to inflate cell");
                convertView = myInflater.inflate(R.layout.cell_layout, parent, false);
            }
            Log.d("getView","attempting to link TextView priority");
            priority = (TextView)convertView.findViewById(R.id.txtPriority);
            Log.d("getView","link established, Attempting to set text for priority");
            priority.setText(String.valueOf((myDataSource.getPriority(position))));
            Log.d("getView", "attempting to link TextView listContent");
            itemContent = (TextView)convertView.findViewById(R.id.txtListContent);
            Log.d("getView","link established, Attempting to set text for listContent");
            itemContent.setText(myDataSource.getItemContent(position));
            Log.d("getView","Successfully executed getView");
            return convertView;
        }
}

最后但同样重要的是,这是我的 Activity

public class MainActivity extends AppCompatActivity {

    private ListDataSource ds;
    private ListView listViewToDo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("MainActivity","Attempting to create data source");
        try {
            ds = new ListDataSource();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            Log.d("MainActivity","Failed to create data source");
        }
        Log.d("Main Activity","Attempting to link empty list view to on screen view");
        listViewToDo = (ListView)findViewById(R.id.listOfLists);
        Log.d("Main Activity","Views linked, Attempting to set adapter to listView");
        listViewToDo.setAdapter(new ListDataSourceAdapter(this, ds));
        Log.d("Maing Activity","Successfully set Adapter");
    }
}

priority 是一个实例字段。您的 CellContent 的每个实例都有自己的 priority;每个都初始化为零,然后在构造函数中递增 1。 CellContent 的一个实例不知道 CellContent 的任何其他实例的内容,它们是完全独立的,因此每个实例报告其优先级为 1。

您要查找的行为需要一个静态字段。静态字段由封闭类型的所有实例共享,并且仅在首次使用 class 时初始化一次:

private static int priorityCounter = 0; // shared by all instances
private int priority; // only this instance

public CellContent(...) {
    priority = ++priorityCounter;
    ...
}

现在每次创建 CellContent 都会增加一个共享计数器并将其 priority 设置为该值。