【问题标题】:Dynamic Grid Layout with Textviews on First Row and First Column第一行和第一列上带有 Textviews 的动态网格布局
【发布时间】:2014-05-26 05:33:46
【问题描述】:

我在动态设计表单时遇到问题。它是表格形式,如下所示:

|        |  Great |  Good | Average | Bad |
|Quality |        |   -   |         |     |
|Perform |        |       |    -    |     |
|Support |    -   |       |         |     |

第一行(标题行)和第一列是动态的,即行和列可以增加或减少,并且将来自网络服务。其他单元格将像按钮一样,只有一个按钮会被激活( - )。

有人知道如何实现这一目标吗?

这是我使用线性布局所做的:这只是一个模拟数据,我还没有实现任何点击事件或捕获用户输入(我不知道该怎么做)它是否涉及管理 ID..

截图: https://drive.google.com/file/d/0BzbVBFzhlWapbzlFeWlJSVF5M1k/edit?usp=sharing

我使用的对象模型是真实对象模型的复制品。

//Table Form Type Layout
private void createFormWithLinearLayouts() 
{
    //Get Feedback Answer List
    ArrayList<FeedbackAnswer> feedbackAnswerList = feedbackQuestionSection.getFeedbackAnswerList();

    //Get Feedback Question List
    ArrayList<FeedbackQuestion> feedbackQuestionList = feedbackQuestionSection.getFeedbackQuestionList();

    //For loop for Questions
    for(int i= -1; i< feedbackQuestionList.size();i++)
    {
        LinearLayout cLayout = new LinearLayout(this);
        cLayout.setOrientation(LinearLayout.HORIZONTAL);
        cLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        MarginLayoutParams  params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.setMargins(5, 5, 5, 5);

        //For loop for AAnswers
        for (int j = -1; j < feedbackAnswerList.size(); j++)
        {
            TextView tv;
            tv = new TextView(this);
            tv.setWidth(100);
            tv.setHeight(50);
            tv.setLayoutParams(params);

            if(i == -1 && j== -1)
            {
                tv.setText(" ");
            }
            else if(i == -1 && j!= -1)
            {
                tv.setText(feedbackAnswerList.get(j).getDesc());
            }
            else if(j != -1)
            {
                //Buttons or Simply Color Change for Select or DeSelect

                //Get Answer from Question
                FeedbackAnswer feedbackAnswerOfQuestion = feedbackQuestionList.get(i).getFeedbackAnswer();

                if(feedbackAnswerList.get(j).getSeqNo() == feedbackAnswerOfQuestion.getSeqNo())
                {
                    tv.setText(feedbackAnswerList.get(j).getDesc()); //The PreSelected Answer will Come from Server
                }
                else
                {
                    tv.setText(" - - -");
                }
            }
            else
            {
                tv = new TextView(this);
                tv.setWidth(80);
                tv.setHeight(50);
                tv.setLayoutParams(params);

                tv.setText(feedbackQuestionList.get(i).getDesc());
            }

            cLayout.addView(tv);
        }


        parentLayout.addView(cLayout);
    }
}

/* 在对象模型中准备的数据

//Prepare Feedback Question Section 
public void prepareFeedbackQuestionSection()
{
    //Question Section (Whole Layout)
    feedbackQuestionSection = new FeedbackQuestionSection();


    /******** Answers will show as Header row **************/
    FeedbackAnswer feedbackAnswer1 = new FeedbackAnswer();
    feedbackAnswer1.setDesc("Great"); 
    feedbackAnswer1.setSeqNo(1);


    FeedbackAnswer feedbackAnswer2 = new FeedbackAnswer();
    feedbackAnswer2.setDesc("Good"); 
    feedbackAnswer2.setSeqNo(2);

    FeedbackAnswer feedbackAnswer3 = new FeedbackAnswer();
    feedbackAnswer3.setDesc("Average"); 
    feedbackAnswer3.setSeqNo(3);

    FeedbackAnswer feedbackAnswer4 = new FeedbackAnswer();
    feedbackAnswer4.setDesc("Bad"); 
    feedbackAnswer4.setSeqNo(4);

    //Answer List (Row Header Texts)
    ArrayList<FeedbackAnswer> feedbackAnswerList = new ArrayList<FeedbackAnswer>();
    feedbackAnswerList.add(feedbackAnswer1);
    feedbackAnswerList.add(feedbackAnswer2);
    feedbackAnswerList.add(feedbackAnswer3);
    feedbackAnswerList.add(feedbackAnswer4);

    /*** Questions will show as First Column Texts **************/
    FeedbackQuestion feedbackQuestion1  = new FeedbackQuestion();
    feedbackQuestion1.setDesc("Quality"); 
    feedbackQuestion1.setSeqNo(1);
    feedbackQuestion1.setFeedbackAnswer(feedbackAnswer3);

    FeedbackQuestion feedbackQuestion2  = new FeedbackQuestion();
    feedbackQuestion2.setDesc("Performance"); 
    feedbackQuestion2.setSeqNo(2);
    feedbackQuestion2.setFeedbackAnswer(feedbackAnswer2);

    FeedbackQuestion feedbackQuestion3  = new FeedbackQuestion();
    feedbackQuestion3.setDesc("Support"); 
    feedbackQuestion3.setSeqNo(3);
    feedbackQuestion3.setFeedbackAnswer(feedbackAnswer4);


    //Question List (First Column Texts)
    ArrayList<FeedbackQuestion> feedbackQuestionList = new ArrayList<FeedbackQuestion>();
    feedbackQuestionList.add(feedbackQuestion1);
    feedbackQuestionList.add(feedbackQuestion2);
    feedbackQuestionList.add(feedbackQuestion3);


    //Add to Question Section
    feedbackQuestionSection.setFeedbackAnswerList(feedbackAnswerList);
    feedbackQuestionSection.setFeedbackQuestionList(feedbackQuestionList);
}

/** 布局 */

<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:id="@+id/layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
</LinearLayout>

/** OnCreate() */ @覆盖 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

    setContentView(R.layout.feedback_form_dynamic);

    //Get Linear Layout
    parentLayout = (LinearLayout) findViewById(R.id.layout);

    //Prepare Data
    prepareFeedbackQuestionSection();

    //Create Form
    createFormWithLinearLayouts();

}

【问题讨论】:

  • 嗨,我还没有编写任何代码,我正在以编程方式尝试表格布局和简单的线性布局,但我无法实现这一点。关于网格布局,我不知道如何使用两个不同的数组列表,标题行中的文本视图是一个数组列表,第一列中的文本视图是另一个数组列表。
  • 我认为 Grid 在这种情况下无法正常工作,能否请您发布代码,您使用线性或表格布局做了什么?
  • @user3675110 你试过的只是告诉我们..这样才能更好地理解你的问题
  • 嗨,我已经编辑了我的帖子以包含更多信息以及我拥有线性布局的代码。

标签: android forms layout dynamic grid


【解决方案1】:

在大量搜索并阅读有关网格视图之后,我制作了具有动态内容的网格视图,并处理了项目单击事件以捕获用户输入。

截图:https://drive.google.com/file/d/0BzbVBFzhlWapTG9vbWREZllNeFU/edit?usp=sharing

基本上有两个数组列表:问题列表和答案列表,都包含“描述”和“序列号”(或级别)。

/*适配器*/

private class FeedbackAdapter extends BaseAdapter
{
    ArrayList<FeedbackAnswer> feedbackAnswerList;
    ArrayList<FeedbackQuestion> feedbackQuestionList;

    public FeedbackAdapter(FeedbackQuestionSection fSection) 
    {
        feedbackQuestionList = fSection.getFeedbackQuestionList();
        feedbackAnswerList = fSection.getFeedbackAnswerList();
    }

    @Override
    public int getCount() 
    {   
        return ((feedbackAnswerList.size() +1 )* ( feedbackQuestionList.size() +1 ));
    }

    @Override
    public Object getItem(int index) 
    {
        if(index == 0)
        {
            return null;
        }
        else if(index <= feedbackAnswerList.size())
        {
            return feedbackAnswerList.get(index - 1);
        }
        else // if(index % (feedbackAnswerList.size() + 1) == 0)
        {
            return feedbackQuestionList.get((index) / (feedbackAnswerList.size() + 1) - 1);
        }
    }

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

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

        if(rowView==null)
        {
            LayoutInflater layoutInflater=LayoutInflater.from(DynamicFormDemo.this);
            rowView = layoutInflater.inflate(android.R.layout.simple_list_item_1, parent,false);
        }

        TextView textView=(TextView) rowView.findViewById(android.R.id.text1);

        //Get Item
        QuestionPaperInterface question = (QuestionPaperInterface) getItem(position);

        if(question != null)
        {
            if(question instanceof FeedbackAnswer)
            {
                question = (FeedbackAnswer) question;
                textView.setText(((FeedbackAnswer) question).getDesc());
            }
            else if(question instanceof FeedbackQuestion)
            {
                question = (FeedbackQuestion) question;

                if(position % (feedbackAnswerList.size() + 1) == 0)
                {
                    textView.setText(((FeedbackQuestion) question).getDesc());
                }
                else
                {
                    //Tag Answer
                    textView.setTag(R.id.feedbackAnswer, feedbackAnswerList.get(position % (feedbackAnswerList.size() + 1) - 1));

                    //Tag Question
                    textView.setTag(R.id.feedbackQuestion, ((FeedbackQuestion) question));

                    FeedbackAnswer feedbackAnswer = ((FeedbackQuestion) question).getFeedbackAnswer();
                    int seq = feedbackAnswer.getSeqNo();

                    //Get Tagged Answer
                    FeedbackAnswer taggedFeedbackAnswer = (FeedbackAnswer) textView.getTag(R.id.feedbackAnswer);

                    int taggedSeqNo = taggedFeedbackAnswer.getSeqNo();

                    if(seq == taggedSeqNo)
                    {
                        textView.setText(feedbackAnswer.getDesc());
                    }
                    else
                    {
                        textView.setText("---");
                    }
                }
            }
        }
        else
        {
            textView.setText("---");
        }

        return rowView;
    }
}

/* 项目点击//

    @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{
    //Get View
    TextView textView = (TextView) view;

    //Get Feedback Answer list
    ArrayList<FeedbackAnswer> feedbackAnswerList = feedbackQuestionSection.getFeedbackAnswerList();

    if(position >= feedbackAnswerList.size() + 1 && position % (feedbackAnswerList.size() + 1) != 0)
    {
        //Get Tagged Feedback Question
        FeedbackQuestion feedbackQuestion = (FeedbackQuestion) textView.getTag(R.id.feedbackQuestion);

        //Get Tagged Feedback Answer
        FeedbackAnswer feedbackAnswer = (FeedbackAnswer) textView.getTag(R.id.feedbackAnswer);

        //Set New Answer in Question
        feedbackQuestion.setFeedbackAnswer(feedbackAnswer);

        //Notify Adapter
        feedbackAdapter.notifyDataSetChanged();

        String toastMessage = "Feedback Answer is :" + feedbackAnswer.getSeqNo() + ": "+feedbackAnswer.getDesc();
        Toast toast = Toast.makeText(this, toastMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

/* 在 On Create() */

    int numOfColms = feedbackQuestionSection.getFeedbackAnswerList().size() + 1; //No of Columns = No of Answers + 1 (Blank first Row First Column)

    GridView gridView = (GridView) findViewById(R.id.gridview);
    gridView.setOnItemClickListener(this);

    gridView.setStretchMode(GridView.NO_STRETCH);  
    gridView.setNumColumns(numOfColms);  

但是它不符合我的要求,这个网格视图垂直滚动,我不需要,因为它的上方和下方有更多的组件,就像一个垂直滚动的完整反馈形式。所以我正在尝试使用表格的另一种解决方案。我发布了这个希望它可以帮助某人。

【讨论】:

    【解决方案2】:

    我通过使用表格来解决问题,动态添加行和列。该表包含在水平布局中,整个布局在 ListView 中。原因是表格和其他组件可能会动态重复和更改顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2017-12-17
      • 2012-03-18
      • 1970-01-01
      • 2016-08-06
      • 2017-06-27
      • 2020-07-24
      相关资源
      最近更新 更多