【问题标题】:Change TextView text to Normal after the object has been pressed按下对象后将 TextView 文本更改为 Normal
【发布时间】:2018-03-26 16:57:55
【问题描述】:

我目前有一个 ListView,它使用 CustomAdapter 来显示来自我的 Firebase 数据库的信息。如下所示:

创建后,我希望绿色框中的文本(ListView 项)为粗体。一旦用户按下该 ListView 项目,我希望文本变为正常,非粗体。

我希望它像电子邮件一样工作。当您收到一封新电子邮件时,标题为粗体,一旦打开该电子邮件并返回收件箱,文本为正常,非粗体。

以下是我所有的相关代码:

MyJobsFragment、SelectItem

// Press the object and display the information and sign the job of with signature pad

    jobListViewMyAcJobs.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            ActiveJobDetailsFragment activeJobDetailsFragment = new ActiveJobDetailsFragment();
            Bundle bundle = new Bundle();
            bundle.putSerializable("Job", adapterActiveJobs.mData.get(position));
            bundle.putSerializable("JobId", adapterActiveJobs.mDataKeys.get(position));
            activeJobDetailsFragment.setArguments(bundle);
            getFragmentManager().beginTransaction().replace(R.id.content, activeJobDetailsFragment).addToBackStack(host.getCurrentTabTag()).commit();
        }
    });

MyCustomAdapter

public class MyCustomAdapter extends BaseAdapter
    {
        private ArrayList<JobInformation> mData = new ArrayList<>();
        private ArrayList<JobInformation> mDataOrig = new ArrayList<>();
        private ArrayList<String> mDataKeys = new ArrayList<>();

        private LayoutInflater mInflater;

        ... Removed Code ...

        @Override
        public View getView(final int position, View convertView, ViewGroup parent)
        {
            // Bid on holder
            MyJobsFragment.MyCustomAdapter.GroupViewHolderBidOn holderBidOn;
            // Accepted holder
            final MyJobsFragment.MyCustomAdapter.GroupViewHolderAccepted holderAccepted;
            // Completed holder
            MyJobsFragment.MyCustomAdapter.GroupViewHolderCompleted holderCompleted;

            if (convertView == null)
            {
                // Bid on
                if (host.getCurrentTab() == 0)
                {
                    convertView = mInflater.inflate(R.layout.job_info_bid_on, null);
                    holderBidOn = new MyJobsFragment.MyCustomAdapter.GroupViewHolderBidOn();

                    holderBidOn.textViewJobName = convertView.findViewById(R.id.textName);
                    holderBidOn.textViewJobDescription = convertView.findViewById(R.id.textDesc);

                    holderBidOn.textViewJobName.setText(mData.get(position).getAdvertName());
                    holderBidOn.textViewJobDescription.setText(mData.get(position).getAdvertDescription());

                    convertView.setTag(holderBidOn);
                }
                // Accepted
                else if (host.getCurrentTab() == 1)
                {
                    convertView = mInflater.inflate(R.layout.job_info_accepted, null);
                    holderAccepted = new MyJobsFragment.MyCustomAdapter.GroupViewHolderAccepted();

                    holderAccepted.textViewJobName = convertView.findViewById(R.id.textName);
                    holderAccepted.textViewDescription = convertView.findViewById(R.id.textDesc);

                    holderAccepted.textViewJobName.setText(mData.get(position).getAdvertName());
                    if(text != null)
                    {
                        text.setTypeface(null, Typeface.BOLD);
                    }

                    holderAccepted.textViewDescription.setText(mData.get(position).getAdvertDescription());
                    // TODO - Was going to add the the users bid into this here, however it's difficult as the bid isnt stored in the jobs table
                    // TODO - I tried to add it in, looped through the bids table and found the bids with the mDataKeys. But it always displayed the last value.

                    convertView.setTag(holderAccepted);
                }
                // Completed
                else if (host.getCurrentTab() == 2)
                {
                    convertView = mInflater.inflate(R.layout.job_info_list_completed, null);

                    holderCompleted = new MyJobsFragment.MyCustomAdapter.GroupViewHolderCompleted();

                    holderCompleted.textViewJobName = convertView.findViewById(R.id.textName);
                    holderCompleted.textViewJobName.setText(mData.get(position).getAdvertName());

                    convertView.setTag(holderCompleted);
                }
            } else
            {
                if (host.getCurrentTab() == 0)
                {
                    holderBidOn = (MyJobsFragment.MyCustomAdapter.GroupViewHolderBidOn) convertView.getTag();
                } else if (host.getCurrentTab() == 1)
                {
                    holderAccepted = (MyJobsFragment.MyCustomAdapter.GroupViewHolderAccepted) convertView.getTag();
                } else if (host.getCurrentTab() == 2)
                {
                    holderCompleted = (MyJobsFragment.MyCustomAdapter.GroupViewHolderCompleted) convertView.getTag();
                }
            }

            return convertView;
        }

        public class GroupViewHolderBidOn
        {
            public TextView textViewJobName;
            public TextView textViewJobDescription;
        }

        public class GroupViewHolderAccepted
        {
            public TextView textViewJobName;
            public TextView textViewDescription;
        }

        public class GroupViewHolderCompleted
        {
            public TextView textViewJobName;
        }
}

【问题讨论】:

  • 你能再清楚一点吗?你想用 textview 做什么?
  • 当用户加载屏幕时,Fragment MyJobsFragment 会显示如上面的ListView,文字被绿色边框包围。如果用户之前没有打开 ListView 项目,所有文本都将加粗。例如,如果我进入应用程序,“新广告”、“新广告”等所有文字都会加粗。当我选择并按下列表中的这些项目之一时,例如顶部的项目。它把我带到了一个新的片段。当我回到 MyJobsFragment 时,文本现在是非粗体的,就像我打开它一样正常。
  • 第一次查看时,ListView Items 文本全部为粗体。然后,当我选择该列表视图项目时,文本变为正常、非粗体并在整个应用程序中保留。所以后来,当我回到这个片段时,文本仍然是非粗体的。在 Outlook 上的电子邮件服务。当我收到一封新电子邮件时,电子邮件的文本都是粗体的。当我打开它然后回到我的收件箱时,文本是非粗体的,正常的,没有应用任何样式我的问题是,如何在我的 Android 应用程序中的 ListView 中复制此功能。
  • textview 在我选择它之前会是粗体,然后它会是非粗体

标签: java android custom-adapter android-typeface


【解决方案1】:

嗯,有多种方法可以实现这一目标。我建议您在 JobInformation 类中添加一个字段,例如

public class JobInformation{
    .
    .
    .
    .
    . // other fields

    private boolean isSelected;

    public boolean isSelected() {
        return isSelected;
    }
    public void setSelected(boolean selected) {
        isSelected = selected;
    }

    .
    .
    . // Other getters/setters

}

现在您需要在单击项目时设置此字段,在您的 onItemClick 函数中执行此操作

public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            ActiveJobDetailsFragment activeJobDetailsFragment = new ActiveJobDetailsFragment();
            Bundle bundle = new Bundle();
            adapterActiveJobs.mData.get(position).setSelected(true); // add this line in your code
            bundle.putSerializable("Job", adapterActiveJobs.mData.get(position));
            bundle.putSerializable("JobId", adapterActiveJobs.mDataKeys.get(position));
            activeJobDetailsFragment.setArguments(bundle);
            getFragmentManager().beginTransaction().replace(R.id.content, activeJobDetailsFragment).addToBackStack(host.getCurrentTabTag()).commit();
        }

最后在您的自定义适配器的getView 方法中,检查isSelected 字段并相应地设置您的textview 样式,将其添加到您的getView 方法中。

if(mData.get(position).isSelected()){
    // set your textview typeface to normal
}
else{
    // set your texview typeface to bold.
}

并且您需要在更新selected 变量时调用adapter.notifyDataSetChanged(),以便调用您的getView

【讨论】:

  • 我一直在尝试在上面实施此解决方案,当我将列表中的该项目的 isSelected 设置为 true 时,它​​确实将其更改为 true。但是,粗体不会更改为正常,因为自定义适配器中的 getView 永远不会被调用。有没有简单的解决方案?
  • 查看更新的答案。您需要调用 adapter.notifyDataSetChanged() ,这将导致调用 getviewadapter 将是您的 MyCustomAdapter 类的对象的名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多