2015-09-17 5 views
0

Я пытаюсь сохранить ссылку из webview. Из моего класса webview я сохраняю URL-адрес страницы, как показано ниже.Listview не правильно загружается

public void AddUrl(String page_url){ 
    SaveUrlActivity urlactivity = new SaveUrlActivity(); 
    urlactivity.saveurl(page_url); 
} 

Мой класс SaveUrlActivity, как показано ниже:

public class SaveUrlActivity extends Activity { 

public String url; 
public ListView lv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_savedurl); 
    lv = (ListView) findViewById(R.id.list); 
    saveurl(url); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      Intent in = new Intent(SaveUrlActivity.this, DisPlayWebPageActivity.class); 

      in.putExtra("page_url", url); 
      startActivity(in); 
     } 
    }); 
} 

public void saveurl(String url1){ 
    url = url1; 
    final List<RowItem> ri = new ArrayList<RowItem>(); 
    RowItem item = new RowItem(url); 
    ri.add(item); 
    SavedUrlAdapter adapter = new SavedUrlAdapter(SaveUrlActivity.this, ri); 
    lv.setAdapter(adapter); 
    } 
} 

Всякий раз, когда я запускаю свою программу, я получаю следующее сообщение об ошибке.

FATAL EXCEPTION: main 
Process: com.example.smarthelp, PID: 16284 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
     at com.example.smarthelp.SaveUrlActivity.saveurl(SaveUrlActivity.java:46) 
     at com.example.smarthelp.DisPlayWebPageActivity.AddUrl(DisPlayWebPageActivity.java:76) 
     at com.example.smarthelp.DisPlayWebPageActivity.onOptionsItemSelected(DisPlayWebPageActivity.java:66) 

Может ли кто-нибудь помочь мне выяснить, где я делаю ошибку?

ответ

1

Вы используете ссылку на ListView lv до его инициализации, и вы не можете сделать это без первого запуска SaveUrlActivity, только после того, как это setContentView(R.layout.activity_savedurl); вы можете инициализировать lv.

public void saveurl(String url1){ 
    url = url1; 
    final List<RowItem> ri = new ArrayList<RowItem>(); 
    RowItem item = new RowItem(url); 
    ri.add(item); 
    SavedUrlAdapter adapter = new SavedUrlAdapter(SaveUrlActivity.this, ri); 
    lv.setAdapter(adapter); 
    } 

Было бы проще, если вы сделаете статический вар в вашем SaveUrlActivity класса и присвоить ему значение, прежде чем начать свою деятельность, и сделайте вызов saveurl() внутри этого класса, когда у вас есть все ваши представления инициализированы.

Что-то вроде:

public void AddUrl(String page_url){ 
    SaveUrlActivity.page_url = page_url; 
    Intent i = new Intent(this, SaveUrlActivity.class); 
    startActivity(i); 
} 

И в вашем SaveUrlActivity.java:

public class SaveUrlActivity extends Activity { 

public String url; 
public ListView lv; 
static page_url; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_savedurl); 
    lv = (ListView) findViewById(R.id.list); 
    saveurl(); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      Intent in = new Intent(SaveUrlActivity.this, DisPlayWebPageActivity.class); 

      in.putExtra("page_url", url); 
      startActivity(in); 
     } 
    }); 
} 

public void saveurl(){ 
    url = page_url; 
    final List<RowItem> ri = new ArrayList<RowItem>(); 
    RowItem item = new RowItem(url); 
    ri.add(item); 
    SavedUrlAdapter adapter = new SavedUrlAdapter(SaveUrlActivity.this, ri); 
    lv.setAdapter(adapter); 
    } 
} 

Это точно, если вы планируете начать эту деятельность, если вам нужно обновить данные в уже начал один , вам лучше использовать Handler

+0

Я понимаю. Это должно быть причиной. Но я не понимаю вашего решения. Можете ли вы немного подробнее ... – Arnab

+0

@Arnab, вы не можете использовать ListView или любой другой вид из еще не запущенной операции. Когда вы говорите «SaveUrlActivity urlactivity = new SaveUrlActivity();' - вы не вызываете onCreate() из этого класса, onCreate() вызывается только в том случае, если вы начинаете этот класс как Activity, иначе вы просто инициализируете его как произвольное класс, вам это не нужно. Я отредактировал мой ответ, проверьте его –

+0

Спасибо Movsar, я попробую это из – Arnab

1

Пара вещей, чтобы посмотреть на:

  1. Убедитесь, что файл activity_savedurl макета фактически содержит вид с list ID. Если это не так, то lv будет null.
  2. Вы передаете url в saveurl(), но вы никогда не назначали ему значение.
+0

Значение lv будет равно нулю в любом случае. У него нет ошибки от 'saveurl (url):' он получает его, когда он делает 'urlactivity.saveurl (page_url);', активность никогда не запускается, и поэтому представления никогда не инициализируются, поэтому все они равны нулю. –

+0

Состояние трассировки стека: 'java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.ListView.setAdapter (android.widget.ListAdapter)' в ссылке нулевого объекта '. – cybersam

+0

Да, он говорит, что он пытается установитьAdapter в ListView, который не был инициализирован. –

Смежные вопросы