Java 如何在从活动类填充ListView的非活动类中正确设置Listener

Java 如何在从活动类填充ListView的非活动类中正确设置Listener,java,android,Java,Android,我的ListView是根据用户在非活动类中的EditText中输入的内容从HashMap动态创建的。我之所以认为它与setOnItemClickListener有关,是因为当我在OnCreate方法的Activity类中手动设置ListView值时,它会起作用。 非活动类包含两个方法,例如AsyncTask和递归方法 活动课 public class WordEntry extends AppCompatActivity implements OnClickListener, OnItemCli

我的ListView是根据用户在非活动类中的EditText中输入的内容从HashMap动态创建的。我之所以认为它与setOnItemClickListener有关,是因为当我在OnCreate方法的Activity类中手动设置ListView值时,它会起作用。 非活动类包含两个方法,例如AsyncTask和递归方法

活动课

public class WordEntry extends AppCompatActivity implements OnClickListener, OnItemClickListener {

//Variable's Declared

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.word_entry);

    /*Code for reading values into HashMap here*/

    btn_Resolve = (Button) findViewById(R.id.submit_word);
    btn_Resolve.setOnClickListener(this);

    //TODO Make list item's clickable.

    spin_options = (Spinner) findViewById(R.id.spin_choose_resolver_type);
    ArrayAdapter<CharSequence> spin_adapter = ArrayAdapter.createFromResource(this,
            R.array.resolver_options, R.layout.simpler_spinner_item);

    spin_adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    spin_options.setAdapter(spin_adapter);
    lv_words = (ListView) findViewById(R.id.lv_word_display);

    /*This following two lines were a test to see if manually setting the adapter worked, it did. */
    //lv_words.setAdapter(spin_adapter);
    //lv_words.setOnItemClickListener(this);


}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Log.i("HelloListView", "You clicked item: " + parent + " at position: " + position);

}


@Override
public void onClick(View v) {

    switch (v.getId()) {
        case R.id.submit_word:

            edt_WordEntry = (EditText) findViewById(R.id.word_entry_textbox);
            word = edt_WordEntry.getText().toString().toLowerCase();
            Pattern pattern = Pattern.compile("\\s");
            Matcher matcher = pattern.matcher(word);
            boolean space_found = matcher.find();
            View hideKey = this.getCurrentFocus();

            if (space_found) {
               edt_WordEntry.setText(R.string.no_spaces_allowed);

            } else {
                ResolveWord fixAnagram = new ResolveWord(word, this,wordHashSet);
                ResolveAllWords fixAnagramAll = new ResolveAllWords(word,this,wordHashSet);

                /*The following two lines are two other methods that I tried during debugging to try get it working. Separately of                  course and this debugging was for when the spinner was set to something other than "Anagram's"*/
                //fixAnagramAll.lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));  
                //lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));                           
                if(spin_options.getSelectedItem().toString().equals("Anagram;s")) {
                    hideKeyboard(this);
                    fixAnagram.execute();
                } else {
                    hideKeyboard(this);
                    fixAnagramAll.execute();
                }
            }
            break;

        default:
            break;
    }

}
public class ResolveWord extends  AsyncTask<Void, Integer, ArrayList<String>> implements OnItemClickListener {

 /*Variable's Declared*/


public ResolveWord(String letters, Activity wordEntryContext, HashSet<String> passedHashSet) {
    /*Variables initiated */

}


   /*Some code.....*/

@Override
protected void onPostExecute(ArrayList<String> wordSuccess) {

    /*Code which puts data into an arraylist so I can put into the array adadater that follows...*/

    ArrayAdapter<String> adapter = new ArrayAdapter<>(thisContext,R.layout.lv_displaywrods_wordentry,
            wordSuccess);

    //Ways I tried to get the ListView clickable in the non-activity class...
    lv_words.setAdapter(adapter);

    //lv_words.setOnItemClickListener(new WordEntry());
    //lv_words.setOnItemClickListener(this);

   /*lv_words.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //I have a break point here to see if the string gets assigned during debugging after clicking a rowitem.
        String x = "Test";

    }
});*/

    //This always returns false
    boolean o = lv_words.hasOnClickListeners();
    //This always returns true
    boolean p = lv_words.isClickable();


}
公共类WordEntry扩展AppCompativeActivity实现OnClickListener、OnItemClickListener{
//变量的声明
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.word\u条目);
/*此处用于将值读入HashMap的代码*/
btn_Resolve=(按钮)findViewById(R.id.submit_word);
btn_Resolve.setOnClickListener(此);
//TODO使列表项可单击。
spin\u options=(微调器)findViewById(R.id.spin\u choose\u resolver\u type);
ArrayAdapter spin_adapter=ArrayAdapter.createFromResource(此,
R.array.resolver\u选项,R.layout.simpler\u微调器\u项);
spin_adapter.setDropDownViewResource(R.layout.simple_微调器_下拉项);
设置适配器(旋转适配器);
lv_words=(ListView)findViewById(R.id.lv_word_display);
/*下面两行是一个测试,看看手动设置适配器是否有效,它是否有效*/
//lv_words.setAdapter(旋转适配器);
//lv_words.setonimclickliester(本);
}
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Log.i(“HelloListView”,“您单击了项目:“+parent+”,位置:“+position”);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.submit\u单词:
edt_WordEntry=(EditText)findViewById(R.id.word_entry_textbox);
word=edt_WordEntry.getText().toString().toLowerCase();
Pattern=Pattern.compile(“\\s”);
Matcher Matcher=pattern.Matcher(word);
布尔空间_found=matcher.find();
View hideKey=this.getCurrentFocus();
如果(找到的空间){
edt_WordEntry.setText(R.string.不允许空格);
}否则{
ResolveWord fixAnagram=新的ResolveWord(word、this、wordHashSet);
ResolveAllWords fixAnagramAll=新的ResolveAllWords(word、this、wordHashSet);
/*下面两行是我在调试过程中尝试的另外两种方法。当然,这两种方法是分开的,当微调器设置为“Anagram”以外的值时,此调试是为它而进行的*/
//fixAnagramAll.lv_words.setonimeclicklistener(新解析词(word,this,wordHashSet));
//lv_words.setOnItemClickListener(新解析词(word,this,wordHashSet));
if(spin_options.getSelectedItem().toString().equals(“Anagram;s”)){
隐藏板(这个);
execute();
}否则{
隐藏板(这个);
fixAnagramAll.execute();
}
}
打破
违约:
打破
}
}
非活动类

public class WordEntry extends AppCompatActivity implements OnClickListener, OnItemClickListener {

//Variable's Declared

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.word_entry);

    /*Code for reading values into HashMap here*/

    btn_Resolve = (Button) findViewById(R.id.submit_word);
    btn_Resolve.setOnClickListener(this);

    //TODO Make list item's clickable.

    spin_options = (Spinner) findViewById(R.id.spin_choose_resolver_type);
    ArrayAdapter<CharSequence> spin_adapter = ArrayAdapter.createFromResource(this,
            R.array.resolver_options, R.layout.simpler_spinner_item);

    spin_adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    spin_options.setAdapter(spin_adapter);
    lv_words = (ListView) findViewById(R.id.lv_word_display);

    /*This following two lines were a test to see if manually setting the adapter worked, it did. */
    //lv_words.setAdapter(spin_adapter);
    //lv_words.setOnItemClickListener(this);


}

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Log.i("HelloListView", "You clicked item: " + parent + " at position: " + position);

}


@Override
public void onClick(View v) {

    switch (v.getId()) {
        case R.id.submit_word:

            edt_WordEntry = (EditText) findViewById(R.id.word_entry_textbox);
            word = edt_WordEntry.getText().toString().toLowerCase();
            Pattern pattern = Pattern.compile("\\s");
            Matcher matcher = pattern.matcher(word);
            boolean space_found = matcher.find();
            View hideKey = this.getCurrentFocus();

            if (space_found) {
               edt_WordEntry.setText(R.string.no_spaces_allowed);

            } else {
                ResolveWord fixAnagram = new ResolveWord(word, this,wordHashSet);
                ResolveAllWords fixAnagramAll = new ResolveAllWords(word,this,wordHashSet);

                /*The following two lines are two other methods that I tried during debugging to try get it working. Separately of                  course and this debugging was for when the spinner was set to something other than "Anagram's"*/
                //fixAnagramAll.lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));  
                //lv_words.setOnItemClickListener(new ResolveWord(word,this,wordHashSet));                           
                if(spin_options.getSelectedItem().toString().equals("Anagram;s")) {
                    hideKeyboard(this);
                    fixAnagram.execute();
                } else {
                    hideKeyboard(this);
                    fixAnagramAll.execute();
                }
            }
            break;

        default:
            break;
    }

}
public class ResolveWord extends  AsyncTask<Void, Integer, ArrayList<String>> implements OnItemClickListener {

 /*Variable's Declared*/


public ResolveWord(String letters, Activity wordEntryContext, HashSet<String> passedHashSet) {
    /*Variables initiated */

}


   /*Some code.....*/

@Override
protected void onPostExecute(ArrayList<String> wordSuccess) {

    /*Code which puts data into an arraylist so I can put into the array adadater that follows...*/

    ArrayAdapter<String> adapter = new ArrayAdapter<>(thisContext,R.layout.lv_displaywrods_wordentry,
            wordSuccess);

    //Ways I tried to get the ListView clickable in the non-activity class...
    lv_words.setAdapter(adapter);

    //lv_words.setOnItemClickListener(new WordEntry());
    //lv_words.setOnItemClickListener(this);

   /*lv_words.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //I have a break point here to see if the string gets assigned during debugging after clicking a rowitem.
        String x = "Test";

    }
});*/

    //This always returns false
    boolean o = lv_words.hasOnClickListeners();
    //This always returns true
    boolean p = lv_words.isClickable();


}
公共类ResolveWord扩展AsyncTask实现OnItemClickListener{
/*变量的声明*/
公共ResolveWord(字符串字母、活动wordEntryContext、HashSet passedHashSet){
/*变量启动*/
}
/*一些代码*/
@凌驾
受保护的void onPostExecute(ArrayList wordSuccess){
/*将数据放入arraylist的代码,这样我就可以将数据放入下面的ArrayAdadater*/
ArrayAdapter=新的ArrayAdapter(此上下文,R.layout.lv\u displaywrods\u wordentry,
文字成功);
//我试图让ListView在非活动类中可单击的方式。。。
lv_字。设置适配器(适配器);
//lv_words.setOnItemClickListener(newwordentry());
//lv_words.setonimclickliester(本);
/*lv_words.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//我在这里有一个断点,以查看在单击行项目后调试期间是否分配了字符串。
字符串x=“测试”;
}
});*/
//这总是返回false
布尔o=lv_words.hasOnClickListeners();
//这总是正确的
布尔p=lv_words.isClickable();
}

在上述代码的基础上,我不久前也做了一些编辑,当时我认为我已经解决了它,并在onCreate方法的activity类中创建了一个
onItemClickListener
,并使用
getOnItemClickListener
为其赋值。然后我通过构造函数将其传递给非activity类,但这也失败了rk.

AsyncTask
中,您可以在
onPostExecute
方法中设置
OnClickListeners
,并在
onPreExecute
方法中设置一个。
您不能在
doInBackground
方法中添加
OnClickListener
或执行任何UI操作,因为您正在那里执行网络操作

因此,您可以设置
OnClickListener
regulary:

lv_words.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick() {
        // Do some coding...
    }
});

AsyncTask
中,您可以在
onPostExecute
方法中设置
OnClickListeners
,并在
onPreExecute
方法中设置一个。
您不能在
doInBackground
方法中添加
OnClickListener
或执行任何UI操作,因为您正在那里执行网络操作

因此,您可以设置
OnClickListener
regulary:

lv_words.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick() {
        // Do some coding...
    }
});

您可以尝试为ResolveWord创建setter,以便将WordEntry对象-WordEntry传递给ResolveWord,并在onPostExecute(…)中写入:lv_words.setOnItemClickListener(WordEntry);

您可以尝试为ResolveWord创建setter